package com.uuzz.lottery.agent.gateway.base;

/**
 * 
 * 类 名: AbsAppendCall
 * 描 述: 调用包装  用于包装底层调用
 * 作 者: liuqing
 * 创 建： 2015年5月6日
 * 版 本：
 * @param <I1> 上层调用（本调用）输入参数
 * @param <O1> 上层调用（本调用）输出参数
 * @param <I2> 下层调用输入参数
 * @param <O2> 下层调用输出参数
 * @param <SI> 输入参数转换器
 * @param <CO> 输出参数转换器
 * @param <C> 下层调用器
 * 历 史: (版本) 作者 时间 注释
 */
public abstract class AbstractAppendCall<I1, O1,I2, O2, C extends IAppendAbleCall<I2, O2>, SI extends ISupplier<I1, I2>, CO extends IConvertor<O2, O1>> extends AbstractFilterCall<I1,O1> implements IAppendCall<I1,O1,I2,O2,C,SI,CO> {
	
	/**
	 * 底层调用器
	 */
	protected C call ;
	
	/**
	 * 入参转换器
	 */
	protected  SI inSupplier;
	
	/**
	 * 出参转换器
	 */
	protected  CO outConvertor;
	
	@Override
	protected final void doCall(I1 in,O1 out) {
		I2 i2 = getInSupplier().buildFrom(in);
		O2 o2 = getCall().defaultOut(i2);
		getCall().call(i2, o2);
		getOutConvertor().convert(o2, out);
	}

    protected C getCall() {
        return call;
    }

    public abstract void setCall(C call);

    protected SI getInSupplier() {
        return inSupplier;
    }

    public abstract void setInSupplier(SI inSupplier);

    protected CO getOutConvertor() {
        return outConvertor;
    }

    public abstract void setOutConvertor(CO outConvertor);
}
